package myjava.nullo;

public class Root {

   public static void main(String[] args) {

      /*
       * Dichiarare un oggetto e inizializzarlo a null non e' un problema in java. 
       * Il punto NON e' che null e' un oggetto in java ma bensi che il puntatore (reference in java)
       * punta semplicemente a niente. La variabile puo' ancora essere solamente un reference
       * per un oggetto solo che al momento non sta puntando a niente. */

      Object o;
      o = null;

      // come vedi qui null NON e' un oggetto!
      // o rimane un reference che puo' puntare solo ad oggetti
      System.out.println(o instanceof Object);

      // poi si puo sempre fare ...
      o = new Object();
      // oppure ...
      o = new String("YO");
      // ... o ancora
      o = new Foo();

      // NULL E TIPI PRIMITIVI
      // questo non si puo' fare perche' nel caso dei tipi primitivi non si
      // parla di reference ma di contenitore di valore veri e propri

      // int x = null;
      // boolean y = null;

      // pero' se una var Foo e' inizializzata a null mica puoi lancira i metodi di Fooo
      Foo o2 = null;
      o2.doIt(); // butta NullPointerException <<<<<<<<<<<
   }
}

class Foo {

   public void doIt() {
      System.out.println("do do");
   }
}